package com.briup.jd2511.jd2511bookstore.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Slf4j
//@Component
public class UploadUtils {

    private UploadUtils() {}

    /**
     * @param file 待上传的文件
     * @return 上传成功后回显的url路径
     */
    public static String fileToLocal(MultipartFile file)
            throws IOException {

        log.info("文件上传到本地nginx中:{}", file.getOriginalFilename());

        //nginx 服务器路径
//        String nginxPath = "D:/dev/nginx/nginx-1.22.0-fileServer/html/";
        String nginxPath = "/Users/mastercgx/IdeaProjects/jidistudy/jd2511/JD2511BookStore/src/main/resources/static/";
        //本项目图文资源在nginx中存放的文件夹路径
        String basePath = "image";

        //指定文件上传路径(本地nginx服务器中)
        String parentPath = nginxPath + basePath + "/";

        //使用工具方法生成上传文件名(格式为：yyyy/MM/dd/uuid.后缀)
        String filename = generateFilePath(file);
        log.info("上传到服务器后的文件名称:{}", filename);

        //创建输出文件对象
        File uploadFile = new File(parentPath, filename);

        //如果父目录不存在,先创建父目录
        File directory = uploadFile.getParentFile();
        if (!directory.exists()) {
            boolean mkdirs = directory.mkdirs();
            log.info("mkdirs: {}",mkdirs);
        }

        //文件上传到本地(nginx服务器中)
        file.transferTo(uploadFile);

        //文件上传成功后,给返回的路径赋值,以存入数据库中,方便在浏览器中访问
        //注意nginx端口号,如果是默认80端口则可以省略，此处我们配置的nginx端口为89
        String url = "http://localhost:89/" + basePath + "/" + filename;

        log.info("文件上传成功,文件地址:{}", url);

        return url;
    }

    /**
     * 随机生成文件在服务器上的名字,格式为： yyyy/MM/dd/uuid.后缀
     * @param file 源文件,用于获取文件 原名
     * @return 文件的新名
     */
    private static String generateFilePath(MultipartFile file) {
        //通过上传日期,对文件进行分类
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
        String datePath = sdf.format(new Date());

        //获取文件名称
        String filename = file.getOriginalFilename();
        assert filename != null;
        //获取文件后缀名
        String suffixName = filename.substring(filename.lastIndexOf("."));

        //生成唯一的文件名并返回,例如：2023/12/14/uuid.png
        return datePath + UUID.randomUUID() + suffixName;
    }
}
